package main

import (
	"fmt"
	"net/http"
	"net/url"
	"strconv"
	"time"

	"github.com/wzh200x/webServer/middleware/signature"
)

// 示例：如何生成签名并发送请求
func main() {
	// 示例参数
	params := map[string]string{
		"username": "admin",
		"password": "password",
	}

	// 签名密钥（需要与服务端一致）
	secretKey := "default_secret_key"

	// 生成时间戳和签名
	timeStamp, sign := signature.GenerateSignature(params, secretKey)

	// 打印生成的时间戳和签名
	fmt.Printf("生成的时间戳: %s\n", timeStamp)
	fmt.Printf("生成的签名: %s\n", sign)

	// 构建请求URL（GET请求示例）
	baseURL := "http://localhost:8080/api/login"
	values := url.Values{}
	for k, v := range params {
		values.Add(k, v)
	}
	values.Add("time", timeStamp)
	values.Add("sign", sign)

	// 完整的请求URL
	requestURL := fmt.Sprintf("%s?%s", baseURL, values.Encode())
	fmt.Printf("完整的请求URL: %s\n", requestURL)

	// 发送GET请求示例
	fmt.Println("\n发送GET请求示例:")
	sendGetRequest(requestURL)

	// POST请求示例
	fmt.Println("\n发送POST请求示例:")
	sendPostRequest(baseURL, values)
}

// 发送GET请求
func sendGetRequest(url string) {
	resp, err := http.Get(url)
	if err != nil {
		fmt.Printf("请求失败: %v\n", err)
		return
	}
	defer resp.Body.Close()

	fmt.Printf("状态码: %d\n", resp.StatusCode)
	// 这里可以添加读取响应体的代码
}

// 发送POST请求
func sendPostRequest(url string, values url.Values) {
	resp, err := http.PostForm(url, values)
	if err != nil {
		fmt.Printf("请求失败: %v\n", err)
		return
	}
	defer resp.Body.Close()

	fmt.Printf("状态码: %d\n", resp.StatusCode)
	// 这里可以添加读取响应体的代码
}

// 模拟签名过期的请求
func sendExpiredRequest() {
	// 示例参数
	params := map[string]string{
		"username": "admin",
		"password": "password",
	}

	// 签名密钥
	// 由于secretKey未被使用，暂时注释掉
	// secretKey := "default_secret_key"

	// 使用过期的时间戳（当前时间减去20秒）
	expiredTime := time.Now().Unix() - 20
	timeStamp := strconv.FormatInt(expiredTime, 10)

	// 构建请求参数
	urlValues := make(url.Values)
	for k, v := range params {
		urlValues.Add(k, v)
	}
	urlValues.Add("time", timeStamp)

	// 计算签名（这里简化处理，实际应调用middleware中的方法）
	// sign := calculateSignature(urlValues, secretKey)
	// urlValues.Add("sign", sign)

	// 完整的请求URL
	baseURL := "http://localhost:8080/api/login"
	requestURL := fmt.Sprintf("%s?%s", baseURL, urlValues.Encode())

	fmt.Printf("过期请求URL: %s\n", requestURL)
	// 这里可以发送请求，但会收到过期错误
}
